Hauptseite Zu yanwittmann.de

Zur Hauptseite

<     8. Objektorientierte Programmierung    

Software >> Java & OOP


Die zusammengesetzten Datentypen waren die Einleitung zur ObjektOrientierten Programmierung (OOP). Doch was ist OOP?

Bei OOP geht es darum, dass unterschiedliche Objekte mit unterschiedlichen Eigenschaften erzeugt werden.
Das Prinzip ist, dass ein zu behandelndes Problem auf einige wenige, beherrschbare Eigenschaften und Operationen reduziert wird. Der erste Schritt ist die Datenmodellierung: Es müssen alle Objekte und deren Eigenschaften gefunden werden, die benötigt werden, um das Problem zu lösen. Diese werden erst mal nur Aufgelistet.

Nehmen wir ein Beispiel an einem realen Objekt, dimmbare Lampen. Eine solche Lampe hat folgende grundlegende Eigenschaften:

Und folgende Operationen, die man an ihr durchführen kann:

Hier einige Beispiele (die Bilder habe ich einfach mal von DALL-E genommen):

Schritt 2 ist es, einen allgemeinen Bauplan für Objekte dieser Art zu erstellen. Dieser wird in der OOP Klasse genannt. Mithilfe dieser Klasse können später konkrete Objekte erzeugt werden.
In Java würde diese Klasse (= zusammengesetzter Datentyp) so aussehen:

public class Lampe {     
    private String form;     
    private Color farbe;
    private final int maxLeuchtkraft;     
    private int aktLeuchtkraft;

    public Lampe(String form, Color farbe, int maxLeuchtkraft) {     
        this.form = form;
        this.farbe = farbe;
        this.maxLeuchtkraft = maxLeuchtkraft;
        this.aktLeuchtkraft = 0;
    }

    public void heller() {
        aktLeuchtkraft = aktLeuchtkraft + 10;
        if (aktLeuchtkraft > maxLeuchtkraft)
            aktLeuchtkraft = maxLeuchtkraft;
    }

    public void dunkler() {
        aktLeuchtkraft = aktLeuchtkraft - 10;
        if (aktLeuchtkraft < 0)
            aktLeuchtkraft = 0;
    }
}
Java

Die Klasse hat die vier Eigenschaften, die wir vorhin definiert haben: String form, Color farbe, int maxLeuchtkraft und int aktLeuchtkraft und die beiden Operationen heller() und dunkler(). Die maxLeuchtkraft soll später nicht mehr verändert werden, darum hat sie noch das Schlüsselwort final, was es zu einer Konstante macht.
Nun da wir den 'Bauplan' für die Objekte haben, können wir diesen auch anwenden. In Java erzeugt man Objekte mit new:

Lampe erdbeerLampe = new Lampe('Erdbeere', new Color(235, 64, 52), 25);     
Lampe avocadoLampe = new Lampe('Avocado', new Color(245, 140, 42), 68);
Java

Wir rufen also nach dem new den Konstruktor (public Lampe(String form, Color farbe, int maxLeuchtkraft)) der Klasse auf und müssen diesem Werte für die angegebenen Formalparameter mitgeben, damit dieser dann die Werte setzen kann. Dieser gibt uns zudem je das erzeugte Objekt zurück und wir können es in unsere Variablen erdbeerLampe und avocadoLampe schreiben.


Zustand und Verhalten

Ein Objekt beschreibt mit seinen Variablen einen gewissen Zustand, also was es jetzt gerade für Eigenschaften hat. Basierend auf diesen Eigenschaften reagiert es unterschiedlich auf verschiedene Eingaben aus seiner Umwelt: Das Verhalten.
Das Verhalten wird durch die Operationen, also Unterprogramme, der Klasse definiert. Dieses Verhalten ist fast immer von dem aktuellen Zustand des Objekts abhängig, da die Variablen des Objektes fast immer in den Operationen verwendet werden.
Im Beispiel von oben mit den Lampen wäre die resultierende Aktion des Objekts auf den Aufruf heller() unterschiedlich, je nach dem, welchen Helligkeitswert die Lampe derzeit hat und welchen maximalen Helligkeitswert die Lampe hat.

Jedes Objekt hat also je seine eigenen Eigenschaften (Variablenwerte). Die Unterprogramme werden jedoch nur ein einziges mal definiert: in der Klasse, die diese Objekte erzeugt hat. Alle Objekte, die von der Klasse erzeugt werden, haben Zugriff auf die Unterprogramme.

Der Zustand eines Objektes wird ja durch die zugehörigen Variablen beschrieben. Im Optimalfall ist die Veränderung der Eigenschaften der Objekte nur durch Unterprogramme (Operationen) möglich. Dies ist aber nur dann gewährleistet, wenn die Variablen auch auf private gesetzt sind, ansonsten (z.B. mit public) können externe Objekte nach belieben auf diese zugreifen und die Werte verändern. Damit würde das Geheimnisprinzip verletzt werden. Also: Alles was möglich ist, auf private setzen.


Sich untereinander kennende Objekte

Ein essenzieller Teil der OOP ist, dass sich Objekte untereinander kennen können. Dies kann dadurch passieren, dass dank call by reference die Referenz zu einem Objekt als Parameter in ein anderes Objekt übergeben wird. In einem Klassen-/ Objektdiagramm wird dies durch Pfeile zwischen den Klassen/Objekten signalisiert.
Hier ein Beispiel mit zwei Klassen, deren Objekte sich untereinander kennen können sollen:

public class Steuerung {     
    private Gui dieGui;

    public Steuerung() {
        dieGui = new Gui(this);     
    }
}

public class Gui() {
    private Steuerung steuerung;

    public Gui(Steuerung steuerung) {     
        this.steuerung = steuerung;
    }
}
Java

Sobald man in diesem Beispiel mit new Steuerung() ein neues Steuerungsobjekt erzeugt, wird eine neue Gui erzeugt, die einen Parameter erwartet: Ein Steuerungsobjekt.
Das soll es auch bekommen: Mit this geben wir das Objekt mit, in dem wir uns gerade befinden, also in dem Steuerungsobjekt. In der Gui wird dieses Objekt dann in die entsprechende Variable steuerung geschrieben.
Nun haben wir in beiden Klassen ein Objekt, das je zum anderen zeigt und haben damit eine Verbindung zwischen den Objekten erzeugt, denn mit diesen Variablen kann nun auf die Operationen des je anderen Objektes zugegriffen werden.

Dies ist eines der Grundkonzepten der OOP und essentiell zum weiteren Programmieren mit mehreren Klassen.


Aufgaben

    Frage 1
Wofür steht OOP? Worum geht es dabei?

    Frage 2
Im Beispiel mit den Lampen oben wird die Klasse Color verwendet. Wie könnte eine grundlegende implementierung dieser mit Konstruktor und Gettern aussehen?

    Frage 3
Wie kann man eine Verknüpfung zwischen zwei Objekten herstellen?

    Frage 4
Erstelle eine Klasse Film, die den Filmtitel, Beschreibung und bis zu 10 Bewertungstexten enthält und entsprechende Getter und Setter hat.
Der Titel soll nicht mehr verändert werden.
Die Bewertungen sollen nicht mehr gelöscht werden, aber es können jederzeit neue dazukommen. Zu Beginn gibt es noch keine Bewertungen.